package it.mp.acquaalta.utility;

import it.mp.acquaalta.AcquaAlta;
import it.mp.acquaalta.widget.R;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Iterator;
import java.util.Map;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;

public class Allarmi {

	private ArrayList<AcquaAltaBean.Bean> al;
	private final Context ctx;
	private final NotificationManager nm;
	private static final String NOTIFICHE_EFFETTUATE = "NOTIFICHE_EFFETTUATE->";

	public Allarmi(ArrayList<AcquaAltaBean.Bean> al, Context ctx) {
		super();
		this.al = al;
		this.ctx = ctx;
		nm = (NotificationManager) ctx.getSystemService(Context.NOTIFICATION_SERVICE);
	}
	public void riallarma() {
		settaAllarmi(true);
	}
	public void settaAllarmi() {
		settaAllarmi(false);
	}
	private void settaAllarmi(boolean forzatura) {
		SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(ctx);
		boolean rosso = pref.getBoolean("ROSSO", false);
		boolean arancione = pref.getBoolean("ARANCIONE", false);
		boolean giallo = pref.getBoolean("GIALLO", false);
		boolean verde = pref.getBoolean("VERDE", false);
		boolean bianco = pref.getBoolean("BIANCO", false);
		boolean azzurro = pref.getBoolean("AZZURRO", false);
		boolean persistent = pref.getBoolean("AZZURRO", true);

		Calendar cal = Calendar.getInstance();

		String separatore = cal.get(Calendar.DAY_OF_YEAR) < 10 ? "00" : cal.get(Calendar.DAY_OF_YEAR) < 100 ? "0" : "";
		int idAttuale = Integer.parseInt(cal.get(Calendar.YEAR) + separatore + cal.get(Calendar.DAY_OF_YEAR) + 0);

		if ((rosso) || (arancione) || (giallo) || (verde) || (bianco) || (azzurro)) {
			Iterator<AcquaAltaBean.Bean> i = al.iterator();
			AcquaAltaBean.Bean bean;
			Notification notification = null;
			pref = ctx.getSharedPreferences(Allarmi.NOTIFICHE_EFFETTUATE, Context.MODE_PRIVATE);

			while (i.hasNext()) {
				notification = null;
				bean = i.next();
				if ((bean.getColore() == R.color.RED) && (rosso)) {
					notification = creaNotifica(bean, pref, persistent, idAttuale, forzatura);
				} else if ((bean.getColore() == R.color.ARANCIONE) && (arancione)) {
					notification = creaNotifica(bean, pref, persistent, idAttuale, forzatura);
				} else if ((bean.getColore() == R.color.GIALLO) && (giallo)) {
					notification = creaNotifica(bean, pref, persistent, idAttuale, forzatura);
				} else if ((bean.getColore() == R.color.VERDE) && (verde)) {
					notification = creaNotifica(bean, pref, persistent, idAttuale, forzatura);
				} else if ((bean.getColore() == R.color.WHITE) && (bianco)) {
					notification = creaNotifica(bean, pref, persistent, idAttuale, forzatura);
				} else if ((bean.getColore() == R.color.AZZURRO) && (azzurro)) {
					notification = creaNotifica(bean, pref, persistent, idAttuale, forzatura);
				}
				if (notification != null) {
					int id = bean.getID();
					SharedPreferences.Editor editor = pref.edit();
					editor.putBoolean(String.valueOf(id), false);
					nm.notify(id, notification);
					editor.commit();
				}
			}

		}
		pulisciAllarmi(pref, persistent, idAttuale);

	}
	private void pulisciAllarmi(SharedPreferences pref, boolean persistent, int idAttuale) {
		// pulisco gli allarmi passati
		int chiave;
		Map<String, ?> map = pref.getAll();
		Iterator<String> itMap = map.keySet().iterator();
		while (itMap.hasNext()) {
			try {
				chiave = Integer.parseInt(itMap.next());
				if (chiave < idAttuale) {
					SharedPreferences.Editor editor = pref.edit();
					editor.remove(String.valueOf(chiave));
					editor.commit();
					if (persistent) {
						nm.cancel(chiave);
					}
				}
			} catch (Exception ex) {

			}
		}
	}

	private Notification creaNotifica(AcquaAltaBean.Bean bean, SharedPreferences pref, boolean persistent, int idAttuale, boolean forzatura) {
		Notification notification = null;
		boolean valore = (!pref.contains(String.valueOf(bean.getID())));
		valore = valore || forzatura;
		if ((idAttuale < bean.getID()) && valore) {
			int icon = bean.getQuadratino();
			CharSequence tickerText = "AcquaAlta";
			long when = System.currentTimeMillis();
			notification = new Notification(icon, tickerText, when);
			notification.defaults |= Notification.DEFAULT_SOUND;
			notification.defaults |= Notification.DEFAULT_VIBRATE;
			notification.defaults |= Notification.DEFAULT_LIGHTS;
			CharSequence contentTitle = "AcquaAlta a Venezia";
			CharSequence contentText = "Prevista marea di " + bean.valore + "cm il " + bean.getData() + " alle " + bean.getOrario();
			Intent notificationIntent = new Intent(ctx, AcquaAlta.class);
			PendingIntent contentIntent = PendingIntent.getActivity(ctx, 0, notificationIntent, 0);
			notification.setLatestEventInfo(ctx, contentTitle, contentText, contentIntent);
			if (persistent) {
				notification.flags |= Notification.FLAG_NO_CLEAR;
			}
		}
		return notification;
	}
}
